home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / SPL.ARJ / PREDITOR.SP < prev    next >
Text File  |  1991-09-26  |  21KB  |  690 lines

  1. BEGIN
  2.      { Preditor : Program editor }
  3.  
  4.      { This program is written in The Structured Programming Language.
  5.      You need to obtain the Structured Programming Language processor
  6.      and process this program with it. A BASIC program will result and
  7.      you will need to sort the program using SORT.EXE and then compile
  8.      the program using any BASIC compiler. This program will run on
  9.      MSDOS, PCDOS, or where there is compiled BASIC, such as on AMIGA,
  10.      MACINTOSH, ATARI ST. You first must translate the program on MSDOS
  11.      or PCDOS. You can obtain the Structured Programming Language from
  12.      PC SIG at 800 245 6717, ask for DISK 666.
  13.      Softdisk at 800 831 2694, ask for BIG BLUE DISK issue #16.
  14.      Public Brand Software at 800 426 3475, ask for DISK BA-9.
  15.      This program PREDITOR and The Structured Programming Language are
  16.      both shareware. Certainly if you use the SPL processor to create
  17.      a running program out of PREDITOR, then you should register both
  18.      The SPL processor and this program, PREDITOR if you use them and
  19.      like them. If you have questions, call me, Dennis Baer at work at
  20.      516 694 5872. }
  21.  
  22.      INTEGER Found,                 { Sucessful find }
  23.              I,J,                   { Counters }
  24.              Character_pointer,     { Character pointer }
  25.              Result,                { Result }
  26.              File_open,             { File open }
  27.              Current_line,          { Current line in file }
  28.              Output_mode,           { Output mode }
  29.              LE;                    { Logical end of file }
  30.  
  31.      STRING L,                { File record }
  32.             Change_delimiter, { Delimiter used in the change command. }
  33.             Ifile;            { Input file name. }
  34.  
  35.      INTEGER ARRAY PT(4000);  { Record pointers }
  36.  
  37.      STRING ARRAY OF(4000);  { File records }
  38.  
  39.      PROCEDURE INITIALIZE;   { Initialize file arrays, output messages. }
  40.      BEGIN
  41.           OUTPUT('*** PREDITOR version 1.0 ***');
  42.           OUTPUT('    (c) Dennis Baer 1988');
  43.           OPEN('LPT1:' FOR OUTPUT AS #7);  { Open printer }
  44.           File_open := 0;  { File open set to zero, file not open }
  45.           Change_delimiter := '!'; { Set default change delimiter }
  46.           FOR I := 1 STEP 1 UNTIL 4000 DO
  47.           BEGIN
  48.                PT(I) := 0;  { Set pointer to record as null }
  49.                OF(I) := ''; { Set record null }
  50.           END
  51.      END
  52.  è     INTEGER LOW,HIGH,Low_line,High_line; { Line number variables }
  53.  
  54.      PROCEDURE OUTSCREEN(LOW,HIGH);
  55.      BEGIN
  56.           IF HIGH=0 THEN
  57.           BEGIN
  58.                OUTPUT('<' @ LOW @ '>' @ OF(PT(LOW)));
  59.                Current_line := LOW;
  60.                RETURN;
  61.           END
  62.           FOR I:= LOW STEP 1 UNTIL HIGH DO
  63.           BEGIN
  64.                OUTPUT('<' @ I @ '>' @ OF(PT(I)));
  65.           END
  66.           Current_line := HIGH;
  67.      END
  68.  
  69.      PROCEDURE OUTPRINTER(LOW,HIGH);
  70.      BEGIN
  71.           FOR I:= LOW STEP 1 UNTIL HIGH DO
  72.           BEGIN
  73.                L := OF(PT(I));
  74.                OUTPUT(#7, MID$(L,1,80));
  75.                IF LEN(L) > 80 THEN
  76.                BEGIN
  77.                     L := MID$(L,81); OUTPUT(#7,L);
  78.                END
  79.           END  
  80.           Current_line := HIGH; OUTPUT();
  81.      END
  82.  
  83.      STRING Search_string, Replace_string;
  84.  
  85.      PROCEDURE FIND(Search_string);
  86.      BEGIN
  87.           Found := 0;
  88.           FOR J := Current_line STEP 1 UNTIL LE DO
  89.           BEGIN
  90.                Character_pointer := INSTR( OF(PT(J)), Search_string );
  91.                IF Character_pointer <> 0 THEN
  92.                BEGIN
  93.                     Current_line := J;
  94.                     Found := 1; RETURN;
  95.                END
  96.           END
  97.           Current_line := 1;
  98.      END
  99.  
  100.      PROCEDURE CHANGE(Search_string,Replace_string);
  101.      BEGIN
  102.           STRING Part_1, Part_2, Part_3;
  103.  
  104.           Found := 0;
  105.           Character_pointer := INSTR( OF(PT(Current_line)), Search_string );
  106.           IF Character_pointer = 0 THEN RETURN;è          IF Character_pointer = 1 THEN
  107.           BEGIN
  108.                Part_1 := '';
  109.           END
  110.  
  111.           ELSE
  112.           BEGIN
  113.                Part_1 := LEFT$( OF(PT(Current_line)), Character_pointer-1 );
  114.           END
  115.  
  116.           IF ( Character_pointer - 1 + LEN(Search_string) ) >
  117.              LEN(OF(PT(Current_line))) THEN
  118.           BEGIN
  119.                Part_3 := '';
  120.                Part_2 := Replace_string;
  121.                OF(PT(Current_line)) := Part_1 + Part_2 + Part_3;
  122.                Found := 1;
  123.                OUTSCREEN(Current_line,0);
  124.                RETURN;
  125.           END
  126.  
  127.           ELSE
  128.           BEGIN
  129.                Part_3 := MID$( OF(PT(Current_line)), Character_pointer +
  130.                                                      LEN(Search_string) );
  131.                Part_2 := Replace_string;
  132.                OF(PT(Current_line)) := Part_1 + Part_2 + Part_3;
  133.                Found := 1;
  134.                OUTSCREEN(Current_line,0);
  135.                RETURN;
  136.           END
  137.      END
  138.  
  139.      PROCEDURE DELETE_LINES(LOW,HIGH);
  140.      BEGIN
  141.           INTEGER Temp;
  142.  
  143.           Temp := LOW;
  144.           IF HIGH = 0 THEN HIGH := LOW;
  145.           FOR J := LOW STEP 1 UNTIL HIGH DO
  146.           BEGIN
  147.                OF(PT(J)) := ''; PT(J) := 0;
  148.           END
  149.           IF HIGH < LE THEN
  150.           BEGIN
  151.                FOR J := HIGH + 1 STEP 1 UNTIL LE DO
  152.                BEGIN
  153.                     PT(Temp) := PT(J);
  154.                     PT(J) := 0;
  155.                     Temp := Temp + 1;
  156.                END
  157.           END
  158.           Current_line := 1; LE := LE - (HIGH-LOW+1);
  159.      END
  160.  è     STRING Line;
  161.  
  162.      PROCEDURE INPUTLINE(Line);
  163.      BEGIN
  164.           INTEGER Temp;
  165.  
  166.           FOR I := 1 STEP 1 UNTIL 4000 DO
  167.           BEGIN
  168.                IF OF(I) = '' THEN
  169.                BEGIN
  170.                     Temp := I;
  171.                     GO TO Found_blank;
  172.                END
  173.           END
  174.           Found := 0;
  175.           RETURN;
  176.  
  177. Found_blank:
  178.  
  179.           Found := 1;
  180.           IF PT(1) = 0 THEN
  181.           BEGIN
  182.                Current_line := 1; LE := 1; PT(1) := Temp;
  183.                OF(PT(1)) := Line; RETURN;
  184.           END
  185.  
  186.           FOR I := LE + 1 STEP -1 UNTIL Current_line + 2 DO
  187.           BEGIN
  188.                IF LE = Current_line THEN GO TO Done_shifting;
  189.                PT(I) := PT(I-1);
  190.           END
  191.  
  192. Done_shifting:
  193.  
  194.           PT(Current_line + 1) := Temp; LE := LE + 1;
  195.           OF(PT(Current_line + 1)) := Line;
  196.           Current_line := Current_line + 1;
  197.      END
  198.            
  199.      STRING File; { File name of open file. }
  200.  
  201.      PROCEDURE OPENFILE(File);
  202.      BEGIN
  203.           INTEGER Temp;
  204.  
  205.           IF File_open = 1 THEN
  206.           BEGIN
  207.                Result := 0;
  208.                RETURN;
  209.           END
  210.  
  211.           ONERRGOTO File_open_error;
  212.  
  213.           OPEN( File FOR INPUT AS #1 );
  214.  è          ONERRGOTO File_read_error;
  215.  
  216.           FOR I := 1 STEP 1 UNTIL 4000 DO
  217.           BEGIN
  218.                IF EOF(1) THEN GO TO Success; { End of file. }
  219.                LINEIN( #1,L); { Read record. }
  220.                IF L = '' THEN L := ' '; { Null line set to a blank }
  221.                PT(I) := I; OF(I) := L; Temp := I;
  222.           END
  223.  
  224. Success:  CLOSE(#1); Result := 1; File_open := 1; { Set file open. }
  225.           LE := Temp; Current_line := 1;
  226.           RETURN;
  227.  
  228. File_open_error: Result := 0; OUTPUT('*** Error, opening file: ' @ File @
  229.                                     ' ***');
  230.           RESUME Finish_open;
  231.  
  232. File_read_error: Result := 0; OUTPUT('*** Error, reading file: ' @ File @
  233.                                     ' ***');
  234.           RESUME Finish_open;
  235.  
  236. Finish_open:
  237.  
  238.      END
  239.  
  240.      PROCEDURE SAVEFILE(File);  { Save text file. }
  241.      BEGIN
  242.           { If file is not open and no file name is given
  243.             give error code and return. }
  244.  
  245.           Result := 1; { Assume result is 1, error will change result. }
  246.  
  247.           IF  File_open AND File = ''  THEN
  248.           BEGIN
  249.                Result := 0; RETURN;
  250.           END
  251.  
  252.           IF LE = 0 THEN
  253.           BEGIN
  254.                OUTPUT('File: ' @ File @ ' is empty. ');
  255.                Result := 0; RETURN;
  256.           END
  257.  
  258.           IF File_open = 0 THEN
  259.           BEGIN
  260.                File_open := 1;
  261.                OPEN(File FOR OUTPUT AS #1);
  262.           END
  263.  
  264.           ELSE
  265.           BEGIN
  266.                OPEN(File FOR OUTPUT AS #1);
  267.           END
  268.  è          FOR I := 1 STEP 1 UNTIL LE DO
  269.           BEGIN
  270.                OUTPUT(#1,OF(PT(I)));
  271.           END
  272.           CLOSE(#1);
  273.      END
  274.  
  275.      PROCEDURE CLOSEFILE(File);  { Close text file. }
  276.      BEGIN
  277.           IF File_open = 0 THEN
  278.           BEGIN
  279.                Result := 0; RETURN; { Error, no file is open. }
  280.           END
  281.           SAVEFILE(File); File := ''; { Save the file. }
  282.           IF Result = 0 THEN RETURN;  { Error occurred. }
  283.           File_open := 0; { File closed, no file open, once again. }
  284.  
  285.           FOR I := 1 STEP 1 UNTIL 4000 DO
  286.           BEGIN
  287.                PT(I) := 0; { Nullify pointer to line. }
  288.                OF(I) := ''; { Set line null. }
  289.           END
  290.           LE := 0; { Set logical end to zero, empty file buffer. }
  291.      END
  292.  
  293.      PROCEDURE REGISTER;
  294.      BEGIN
  295.           OUTPUT();
  296.           OUTPUT(
  297.           '*****************************************************************');
  298.           OUTPUT(
  299.           '*  This program PREDITOR has been developed by Dennis Baer.     *');
  300.           OUTPUT(
  301.           '*  If you use this program and you like it then make a pledge   *');
  302.           OUTPUT(
  303.           '*  of $25. Send a post card with your name and address on the   *');
  304.           OUTPUT(
  305.           '*  front and my name and address on the back and write $25 as   *');
  306.           OUTPUT(
  307.           '*  your pledge, also on back. Place this post card in a         *');
  308.           OUTPUT(
  309.           '*  business envelope and mail it to:                            *');
  310.           OUTPUT(
  311.           '*                                                               *');
  312.           OUTPUT(
  313.           '*  Dennis Baer                                                  *');
  314.           OUTPUT(
  315.           '*  25 Miller Road                                               *');
  316.           OUTPUT(
  317.           '*  Farmingdale,New York 11735                                   *');
  318.           OUTPUT(
  319.           '*                                                               *');
  320.           OUTPUT(
  321.           '*  When you receive your post card back, HONOR your pledge and  *');
  322.           OUTPUT(è          '*  make check out for $25 to Dennis Baer. THANK YOU.            *');
  323.           OUTPUT(
  324.           '*  Registered users are entitled to software support.           *');
  325.           OUTPUT(
  326.           '*  Call 516 694 5872                                            *');
  327.           OUTPUT(
  328.           '*****************************************************************');
  329.      END
  330.  
  331.  
  332.      { Main program   }
  333.  
  334.      INITIALIZE;
  335.  
  336.      REGISTER;
  337.  
  338.      Ask:
  339.  
  340.      OUTPUT();
  341.      OUTPUT('Edit'); OUTPUT('>' @);
  342.      LINEIN(Line); { Get an input line }
  343.  
  344.      Remove_space:
  345.  
  346.      IF Line = ' ' OR Line = '' THEN
  347.      BEGIN
  348.           OUTPUT('Error, invalid Edit command '); GO Ask;
  349.      END
  350.  
  351.      IF LEFT$(Line,1) = ' ' THEN  { Remove extra spaces from the left }
  352.      BEGIN
  353.           Line := RIGHT$(Line,LEN(Line)-1); GO Remove_space;
  354.      END
  355.  
  356. { *************************** STOP COMMAND ********************************** }
  357.  
  358.  
  359.      IF Line = 'STOP' OR Line = 'stop' THEN
  360.      BEGIN
  361.          CLOSE(); 
  362.          REGISTER;
  363.          STOP;
  364.      END
  365.  
  366. { *************************** SAVE FILE COMMAND ***************************** }
  367.  
  368.  
  369.      IF LEFT$(Line,1) = 'S' OR LEFT$(Line,1) = 's' THEN  { Save file }
  370.      BEGIN
  371.           IF MID$(Line,2,1) <> ' ' THEN
  372.           BEGIN
  373.                OUTPUT('Error, missing space'); GO Ask;
  374.           END
  375.           IF LEN(Line) <= 2 THEN
  376.           BEGINè               Blank:
  377.  
  378.                OUTPUT('No file name entered.'); GO Ask;
  379.           END
  380.  
  381.           Ifile := RIGHT$(Line,LEN(Line)-2);
  382.           Result := 1; { Assume successful result beforehand }
  383.  
  384.           SAVEFILE(Ifile); { Save file buffer to disk }
  385.  
  386.           IF Result = 0 THEN
  387.           BEGIN
  388.                OUTPUT('Failure to save file ' @ Ifile); GO Ask;
  389.           END
  390.           GO Ask;
  391.      END
  392.  
  393. { *************************** CLOSE FILE COMMAND **************************** }
  394.  
  395.      IF LEFT$(Line,2) = 'CL' OR LEFT$(Line,2) = 'cl' THEN
  396.      BEGIN
  397.           Result := 1;  { Assume successful result at first }
  398.           CLOSEFILE(Ifile);
  399.           IF Result = 0 THEN
  400.           BEGIN
  401.                OUTPUT('Failure to close file ' @ Ifile); GO Ask;
  402.           END
  403.           GO Ask;
  404.      END
  405.  
  406. { *************************** OPEN FILE COMMAND ***************************** }
  407.  
  408.      IF LEFT$(Line,3) = 'OP ' OR LEFT$(Line,3) = 'op ' THEN
  409.      BEGIN
  410.           IF File_open = 1 THEN
  411.           BEGIN
  412.                OUTPUT('File ' @ Ifile @ ' is already open, error.');
  413.                GO Ask;
  414.           END
  415.           Ifile := RIGHT$(Line,LEN(Line)-2);
  416.           IF LEN(Line)<=3 THEN
  417.           BEGIN
  418.                OUTPUT('No file name entered, error.');
  419.                GO Ask;
  420.           END
  421.           Result := 1; { Assume result is 1 }
  422.           OPENFILE(Ifile);
  423.           IF Result = 0 THEN
  424.           BEGIN
  425.                OUTPUT('Failure to open file ' @ Ifile);
  426.                GO Ask;
  427.           END
  428.           GO Ask;
  429.      END
  430.  è{ *************************** LIST COMMAND ********************************** }
  431.  
  432.      IF LEFT$(Line,1) = 'L' OR LEFT$(Line,1) = 'l' THEN
  433.      BEGIN
  434.           Output_mode := 0; { Set output mode to list }
  435.           IF Line = 'L' OR Line = 'L ' OR Line = 'l' OR Line = 'l ' THEN
  436.           BEGIN
  437.                Low_line := Current_line; High_line := Current_line;
  438.                GO Check_and_print;
  439.           END
  440.  
  441.           The_rest:
  442.  
  443.           IF MID$(Line,2,1) <> ' ' THEN
  444.           BEGIN
  445.                OUTPUT('Missing space'); GO Ask;
  446.           END
  447.           Line := RIGHT$(Line,LEN(Line)-2);
  448.           Low_line := VAL(Line);
  449.           IF Low_line <= 0 THEN
  450.           BEGIN
  451.                OUTPUT('Invalid low line number'); GO Ask;
  452.           END
  453.           Character_pointer := INSTR(Line,',');
  454.           IF Character_pointer = 0 THEN
  455.           BEGIN
  456.                High_line := Low_line;
  457.                GO Check_and_print;
  458.           END
  459.           IF Character_pointer = LEN(Line) THEN
  460.           BEGIN
  461.                OUTPUT('No high line number entered');
  462.                GO Ask;
  463.           END
  464.           Line := MID$(Line,Character_pointer+1);
  465.           IF Line = '*' THEN
  466.           BEGIN
  467.                High_line := LE;
  468.                GO Check_and_print;
  469.           END
  470.           High_line := VAL(Line);
  471.           IF High_line <=0 THEN
  472.           BEGIN
  473.                OUTPUT('Invalid high line number');
  474.                GO Ask;
  475.           END
  476.  
  477.           Check_and_print:
  478.  
  479.           IF Low_line  > LE  OR
  480.              Low_line  < 1   OR
  481.              High_line > LE  OR
  482.              High_line < 1   THEN
  483.           BEGIN
  484.                OUTPUT('Line number out of bounds');è               GO Ask;
  485.           END
  486.           IF Low_line > High_line THEN
  487.           BEGIN
  488.                OUTPUT('First line number higher than second line number');
  489.                GO Ask;
  490.           END
  491.  
  492.           IF Output_mode = 1 THEN
  493.           BEGIN
  494.                OUTPRINTER(Low_line,High_line); GO Ask;
  495.           END
  496.  
  497.           IF Output_mode = 0 THEN
  498.           BEGIN
  499.                OUTSCREEN(Low_line,High_line); GO Ask;
  500.           END
  501.  
  502.           IF Output_mode = 2 THEN
  503.           BEGIN
  504.                DELETE_LINES(Low_line,High_line); GO Ask;
  505.           END
  506.      END
  507.  
  508. { *************************** TOP COMMAND *********************************** }
  509.  
  510.      IF Line = 'T' OR Line = 't' THEN
  511.      BEGIN
  512.           Current_line := 1;
  513.           OUTPUT('Top');
  514.           GO Ask;
  515.      END
  516.  
  517. { *************************** PRINT COMMAND ********************************* }
  518.  
  519.      IF LEFT$(Line,1) = 'P' OR LEFT$(Line,1) ='p' THEN
  520.      BEGIN
  521.           Output_mode := 1;
  522.           IF Line = 'P' OR Line = 'P ' OR Line = 'p' OR Line = 'p ' THEN
  523.           BEGIN
  524.                High_line := Current_line;
  525.                Low_line := Current_line;
  526.                GO Check_and_print;
  527.           END
  528.  
  529.           ELSE GO TO The_rest;
  530.      END
  531.  
  532. { *************************** DELETE COMMAND ******************************** }
  533.  
  534.      IF LEFT$(Line,1) = 'D' OR LEFT$(Line,1) = 'd' THEN
  535.      BEGIN
  536.           Output_mode := 2;  { delete is mode 2 }
  537.           IF Line = 'D' OR Line ='D ' OR Line = 'd' OR Line = 'd ' THEN
  538.           BEGINè               Low_line := Current_line;
  539.                High_line := Current_line;
  540.                GO Check_and_print;
  541.           END
  542.  
  543.           ELSE GO TO The_rest;
  544.      END
  545.  
  546. { *************************** CHANGE COMMAND ******************************** }
  547.  
  548.      IF LEFT$(Line,1) = 'C' OR LEFT$(Line,1) = 'c' THEN
  549.      BEGIN
  550.           STRING Search,     { Contains search string }
  551.                  Replace;    { Contains replacement string }
  552.  
  553.           Line := MID$(Line,2);
  554.  
  555.           Strip_blank:
  556.  
  557.           IF LEFT$(Line,1) = ' ' THEN
  558.           BEGIN
  559.                Line := MID$(Line,2);
  560.                GO Strip_blank;
  561.           END
  562.           IF LEFT$(Line,1) <> Change_delimiter THEN
  563.           BEGIN
  564.                OUTPUT('Missing ' @ Change_delimiter);
  565.                GO Ask;
  566.           END
  567.           Search := ''; Line := MID$(Line,2);
  568.           IF LEN(Line) = 0 THEN
  569.           BEGIN
  570.                OUTPUT('Error, search string is null'); GO Ask;
  571.           END
  572.           IF MID$(Line,1,1) = Change_delimiter THEN
  573.           BEGIN
  574.                OUTPUT('Error, no string entered for search');
  575.                GO Ask;
  576.           END
  577.  
  578.           Build:
  579.  
  580.           Search := Search + MID$(Line,1,1); Line := MID$(Line,2);
  581.           IF Line = '' THEN
  582.           BEGIN
  583.                OUTPUT('Missing ' @ Change_delimiter);
  584.                GO Ask;
  585.           END
  586.           IF LEFT$(Line,1) <> Change_delimiter THEN GO Build;
  587.           Replace := MID$(Line,2); { Get replacement string }
  588.           CHANGE(Search,Replace);
  589.           IF Found = 0 THEN
  590.           BEGIN
  591.                OUTPUT('String:' @ Search @ ' not found');
  592.                GO Ask;è          END
  593.           GO Ask;
  594.      END
  595.  
  596. { *************************** FIND COMMAND ********************************** }
  597.  
  598.      IF LEFT$(Line,1) = 'F' OR LEFT$(Line,1) = 'f' THEN
  599.      BEGIN
  600.           STRING Search;  { String to search for }
  601.  
  602.           IF Line = 'F' OR Line = 'F ' OR Line = 'f' OR Line = 'f ' THEN
  603.           BEGIN
  604.                OUTPUT('Missing search string');
  605.                GO Ask;
  606.           END
  607.  
  608.           Line := MID$(Line,2);
  609.  
  610.           Strip:
  611.  
  612.           IF LEFT$(Line,1) = ' ' THEN
  613.           BEGIN
  614.                Line :=MID$(Line,2);
  615.                GO Strip;
  616.           END
  617.  
  618.           IF MID$(Line,1,1) <> Change_delimiter THEN
  619.           BEGIN
  620.                OUTPUT('Missing ' @ Change_delimiter);
  621.                GO Ask;
  622.           END
  623.           Search := ''; Line := MID$(Line,2);
  624.           IF LEN(Line) = 0 THEN
  625.           BEGIN
  626.                OUTPUT('Missing string to be found');
  627.                GO Ask;
  628.           END
  629.           IF MID$(Line,1,1) = Change_delimiter THEN
  630.           BEGIN
  631.                OUTPUT('Error, null search string');
  632.                GO Ask;
  633.           END
  634.  
  635.           Build_1:
  636.  
  637.           Search := Search + MID$(Line,1,1); Line := MID$(Line,2);
  638.           IF Line = '' THEN
  639.           BEGIN
  640.                OUTPUT('Missing ' @ Change_delimiter);
  641.                GO Ask;
  642.           END
  643.           IF LEFT$(Line,1) <> Change_delimiter THEN GO Build_1;
  644.           FIND(Search);
  645.           IF Found := 0 THEN
  646.           BEGINè               OUTPUT('String: ' @ Search @ ' not found');
  647.                Current_line := 1;
  648.                GO Ask;
  649.           END
  650.           GO Ask;
  651.      END
  652.  
  653. { *************************** BOTTOM COMMAND ******************************** }
  654.  
  655.      IF Line = 'B' OR Line = 'b' THEN
  656.      BEGIN
  657.           Current_line := LE;
  658.           OUTPUT('Bottom at line: ' @ Current_line);
  659.           GO Ask;
  660.      END
  661.  
  662. { *************************** INPUT COMMAND ********************************* }
  663.  
  664.      IF Line = 'I' OR Line = 'i' THEN
  665.      BEGIN
  666.           OUTPUT('Input'); OUTPUT('>' @);
  667.           Line := '';
  668.  
  669.           Inline:
  670.  
  671.           LINEIN(Line);
  672.           IF Line = '' THEN GO Ask;
  673.           INPUTLINE(Line);
  674.           IF Found = 1 THEN
  675.           BEGIN
  676.                OUTPUT('>' @);
  677.                GO Inline;
  678.           END
  679.           OUTPUT('Input stopped, input buffer is full');
  680.           GO Ask;
  681.      END
  682.  
  683.      OUTPUT('Invalid Edit command:' @ Line); GO Ask;
  684.  
  685.      { End of program }
  686.  
  687. END 
  688.  
  689. 
  690.